import type { SizeFormat } from "../SizeFormat.js";
import type { NumberKind } from "../types.js";

/**
 * 基础请求字段选项
 */
export interface BaseRequestFieldOption {
    /**
     * 字段名称
     */
    name: string;
    /**
     * 是否只读
     */
    readonly?: boolean;
}

/**
 * 数值类型字段选项
 */
export interface NumberRequestFieldOption extends BaseRequestFieldOption {
    /** 数据类型 */
    kind: NumberKind;
    /** 初始值 */
    value: number;
}

export interface StringRequestFieldOption extends BaseRequestFieldOption {
    /** 数据类型 */
    kind: "string";
    /** 初始值 */
    value?: string | undefined;
    /**
     * 是否在前面添加字符串的长度
     * 0 - 不添加
     * 1 - 添加一个 u8 用于表示长度
     * 2 - 添加一个 u16 用于表示长度
     * 4 - 添加一个 u32 用于表示长度
     */
    length?: SizeFormat | undefined;
}

export interface ListRequestFieldOption extends BaseRequestFieldOption {
    /**
     * 数据类型
     */
    kind: "list";
    /**
     * 初始值
     */
    value?: number[] | undefined;
    /**
     * 列表前面的长度字段
     * 0 - 不添加
     * 1 - 添加一个 u8 用于表示长度
     * 2 - 添加一个 u16 用于表示长度
     * 4 - 添加一个 u32 用于表示长度
     */
    sizeFormat?: SizeFormat | undefined;
    /**
     * 每次增加的步长
     */
    step?: number | undefined;
}

/**
 * 自定义请求字段更新时的上下文
 */
export interface CustomRequestFieldContext {
    /** 所有字段的长度列表 */
    lengths: Record<string, number>;
}

export interface CustomRequestFieldOption extends BaseRequestFieldOption {
    /** 数据类型 */
    kind: "custom";

    /** 回调函数 */
    cb: (ctx: CustomRequestFieldContext) => number[];
}

export interface EnumRequestFieldOption extends BaseRequestFieldOption {
    /** 数据类型 */
    kind: "enum";
    /** 初始值 */
    value?: number | undefined;
    /** 枚举列表 */
    enums: Record<string, number>;
    /** 长度，默认值为 1 */
    size?: SizeFormat | undefined;
}

/** 请求字段选项 */
export type RequestFieldOption =
    | NumberRequestFieldOption
    | StringRequestFieldOption
    | ListRequestFieldOption
    | CustomRequestFieldOption
    | EnumRequestFieldOption;

export interface RequestOption {
    /** 接口名称 */
    name: string;
    /** 接口描述 */
    description?: string;
    /** 字段列表 */
    fields: RequestFieldOption[];
}
